package com.gs.domain.wrapper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Observable;
import java.util.Vector;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.gs.Controllore;
import com.gs.GSAActivity;
import com.gs.business.AltreUtil;
import com.gs.business.DBUtil;
import com.gs.business.cache.CacheUtenti;
import com.gs.domain.Entrate;
import com.gs.domain.IEntrate;
import com.gs.domain.Utenti;
import com.molinari.jdbcandroid.wrap.ConnectionAndroid;
import comi.gsi.command.javabeancommand.AbstractOggettoEntita;
import comi.gsi.command.javabeancommand.IWrapperEntity;
import comi.gsi.db.LineStackTracePrinter;

public class WrapEntrate extends Observable implements IWrapperEntity, IEntrate {

	private final Entrate entrate;

	public WrapEntrate() {
		entrate = new Entrate();
	}

	public WrapEntrate(final Entrate entrata) {
		this.entrate = entrata;
	}

	@Override
	public Object selectById(final int id) {
		Entrate entrata = null;
		try {
			final Connection cn = DBUtil.getConnection();
			ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
			String[] idEntrataString = new String[] { Integer.toString(id) };
			String orderBy = Entrate.DATA + " desc";
			final Cursor rs = cnAndroid.getDb().query(Entrate.NOME_TABELLA, null, Entrate.ID, idEntrataString, null, null, orderBy);
			if (rs.moveToFirst()) {
				do {
					entrata = new Entrate();
					final Utenti utente = CacheUtenti.getSingleton().getUtente(Integer.toString(rs.getInt(6)));
					setEntrataFromCursor(utente, rs, entrata);
				} while (rs.moveToNext());
			}
			if (rs != null && !rs.isClosed()) {
				rs.close();
			}
			cnAndroid.close();
		} catch (Exception e) {
			Log.e(e.getClass().getName(), LineStackTracePrinter.scriviLineaDellErrore());
		}
		return entrata;

	}

	private void setEntrataFromCursor(final Utenti utente, final Cursor cursor, final Entrate entrata) {
		entrata.setidEntrate(cursor.getInt(0));
		entrata.setdescrizione(cursor.getString(1));
		entrata.setFisseoVar(cursor.getString(2));
		entrata.setinEuro(cursor.getDouble(3));
		entrata.setdata(cursor.getString(4));
		entrata.setnome(cursor.getString(5));
		if (utente != null) {
			entrata.setUtenti(utente);
		}
		entrata.setDataIns(cursor.getString(7));
	}

	@Override
	public Iterator<Object> selectWhere(final String where) {
		// TODO Auto-generated method stub
		return null;
	}

	public Vector<Object> selectAllForUtente() {
		final Vector<Object> entrate = new Vector<Object>();
		final Utenti utente = Controllore.getUtenteLogin();
		final Connection cn = DBUtil.getConnection();
		ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
		try {

			final Cursor cursor = cnAndroid.getDb().query(Entrate.NOME_TABELLA, null, null, null, null, null, Entrate.DATA + " desc");

			if (cursor.moveToFirst()) {
				do {
					final Entrate entrata = new Entrate();
					setEntrataFromCursor(utente, cursor, entrata);
					entrate.add(entrata);
				} while (cursor.moveToNext());
			}
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
			cnAndroid.close();
		} catch (final Exception e) {
			e.printStackTrace();
		} finally {
		}
		return entrate;
	}

	@Override
	public Vector<Object> selectAll() {
		final Vector<Object> entrate = new Vector<Object>();
		final Connection cn = DBUtil.getConnection();
		final ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
		try {
			String orderBy = Entrate.DATA + " desc";
			Cursor cursor = cnAndroid.getDb().query(Entrate.NOME_TABELLA, null, null, null, null, null, orderBy);
			if (cursor.moveToFirst()) {
				do {
					String idUtente = Integer.toString(cursor.getInt(6));
					Utenti utente = cursor.getInt(6) != 0 ? CacheUtenti.getSingleton().getUtente(idUtente) : null;
					final Entrate entrata = new Entrate();
					setEntrataFromCursor(utente, cursor, entrata);
					entrate.add(entrata);
				} while (cursor.moveToNext());
			}

			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
			cnAndroid.close();
		} catch (Exception e) {
		}

		return entrate;
	}

	@Override
	public boolean insert(final Object oggettoEntita) {

		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final SQLiteDatabase db = cnAndroid.getDb();
		final Entrate entrata = (Entrate) oggettoEntita;

		ContentValues values = new ContentValues();
		values.put(Entrate.DESCRIZIONE, entrata.getdescrizione());
		values.put(Entrate.FISSEOVAR, entrata.getFisseoVar());
		values.put(Entrate.INEURO, entrata.getinEuro());
		values.put(Entrate.DATA, entrata.getdata());
		values.put(Entrate.NOME, entrata.getNomeEntita());
		values.put(Entrate.DATAINS, entrata.getDataIns());
		if (entrata.getUtenti() != null) {
			values.put(Entrate.IDUTENTE, entrata.getUtenti().getidUtente());
		}

		if (db.insert(Entrate.NOME_TABELLA, null, values) == -1) {
			return false;
		}
		DBUtil.chiudiElementiDb(cnAndroid, null);
		return true;
	}

	@Override
	public boolean delete(final int id) {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final SQLiteDatabase db = cnAndroid.getDb();
		String[] idEntrate = new String[] { Integer.toString(id) };
		try {
			if (db.delete(Entrate.NOME_TABELLA, Entrate.ID + " = ?", idEntrate) == 0) {
				cnAndroid.close();
				return false;
			}
		} catch (Exception e) {
		}
		return true;
	}

	@Override
	public boolean update(final Object oggettoEntita) {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final Entrate entrata = (Entrate) oggettoEntita;
		final SQLiteDatabase db = cnAndroid.getDb();
		final ContentValues args = new ContentValues();
		args.put(Entrate.DESCRIZIONE, entrata.getdescrizione());
		args.put(Entrate.FISSEOVAR, entrata.getdescrizione());
		args.put(Entrate.INEURO, entrata.getinEuro());
		args.put(Entrate.DATA, entrata.getdata());
		args.put(Entrate.NOME, entrata.getNomeEntita());
		args.put(Entrate.IDUTENTE, entrata.getUtenti() != null ? entrata.getUtenti().getidUtente() : 0);
		args.put(Entrate.DATAINS, entrata.getDataIns());
		try {
			if (db.update(Entrate.NOME_TABELLA, args, Entrate.ID + " = " + entrata.getIdEntita(), null) > 0) {
				cnAndroid.close();
				return true;
			}

		} catch (Exception e) {
		}
		return false;
	}

	@Override
	public boolean deleteAll() {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final SQLiteDatabase db = cnAndroid.getDb();
		try {
			if (db.delete(Entrate.NOME_TABELLA, "1", null) > 0) {
				cnAndroid.close();
				return true;
			}
		} catch (Exception e) {
		}
		return false;
	}

	// metodo che restituisce le ultime dieci entrate
	/**
	 * Permette di ottenere un vettore con un numero di entita' entrate inserito
	 * come parametro
	 * 
	 * @param numEntry
	 * @return Vector<Entrate>
	 */
	public Vector<Entrate> movimentiEntrateFiltrati(final String dataDa, final String dataA, final String nome, final Double euro, final String categoria) {
		Vector<Entrate> entrate = null;
		final Utenti utente = new Utenti() /* GSAndroidActivity.getUtenteLogin() */;
		int idUtente = 0;
		if (utente != null) {
			idUtente = utente.getidUtente();
		}

		final StringBuffer sql = new StringBuffer();
		sql.append("SELECT * FROM " + Entrate.NOME_TABELLA + " WHERE " + Entrate.IDUTENTE + " = " + idUtente);
		if (AltreUtil.checkData(dataDa, "/") && AltreUtil.checkData(dataA, "/")) {
			sql.append(" AND " + Entrate.DATA + " BETWEEN '" + dataDa + "'" + " AND '" + dataA + "'");
		} else if (AltreUtil.checkData(dataDa, "/")) {
			sql.append(" AND " + Entrate.DATA + " = '" + dataDa + "'");
		}
		if (nome != null) {
			sql.append(" AND " + Entrate.NOME + " = '" + nome + "'");
		}
		if (euro != null) {
			sql.append(" AND " + Entrate.INEURO + " = " + euro);
		}
		if (categoria != null) {
			sql.append(" AND " + Entrate.FISSEOVAR + " = '" + categoria + "'");
		}
		final Connection cn = DBUtil.getConnection();
		try {
			final Statement st = cn.createStatement();
			final ResultSet rs = st.executeQuery(sql.toString());
			entrate = new Vector<Entrate>();
			while (rs.next()) {
				final Entrate e = new Entrate();
				e.setdata(rs.getString(5));
				e.setdescrizione(rs.getString(2));
				e.setFisseoVar(rs.getString(3));
				e.setidEntrate(rs.getInt(1));
				e.setinEuro(rs.getDouble(4));
				e.setnome(rs.getString(6));
				e.setUtenti(utente);
				e.setDataIns(rs.getString(8));
				entrate.add(e);
			}
		} catch (final SQLException e) {
			e.printStackTrace();
		}
		try {
			cn.close();
		} catch (final SQLException e) {
			e.printStackTrace();
		}
		return entrate;

	}

	// metodo che restituisce le ultime dieci entrate
	/**
	 * Permette di ottenere un vettore con un numero di entita' entrate inserito
	 * come parametro
	 * 
	 * @param numEntry
	 * @return Vector<Entrate>
	 */
	public Vector<Entrate> dieciEntrate(final int numEntry) {
		Vector<Entrate> entrate = null;
		final Utenti utente = /* GSAndroidActivity.getUtenteLogin() */new Utenti();
		int idUtente = 0;
		if (utente != null) {
			idUtente = utente.getidUtente();
		}

		final String sql = "SELECT * FROM " + Entrate.NOME_TABELLA + " where " + Entrate.DATA + " BETWEEN '" + GSAActivity.getAnno() + "/01/01" + "'" + " AND '" + GSAActivity.getAnno() + "/12/31"
				+ "'" + " AND " + Entrate.IDUTENTE + " = " + idUtente + " ORDER BY " + Entrate.ID + " desc limit 0," + numEntry;
		final Connection cn = DBUtil.getConnection();
		try {
			final Statement st = cn.createStatement();
			final ResultSet rs = st.executeQuery(sql);
			entrate = new Vector<Entrate>();
			while (rs.next()) {
				final Entrate e = new Entrate();
				e.setdata(rs.getString(5));
				e.setdescrizione(rs.getString(2));
				e.setFisseoVar(rs.getString(3));
				e.setidEntrate(rs.getInt(1));
				e.setinEuro(rs.getDouble(4));
				e.setnome(rs.getString(6));
				e.setUtenti(utente);
				e.setDataIns(rs.getString(8));
				entrate.add(e);
			}
		} catch (final SQLException e) {
			e.printStackTrace();
		}
		try {
			cn.close();
		} catch (final SQLException e) {
			e.printStackTrace();
		}
		return entrate;

	}

	/**
	 * Cancella l'ultima entita' "Entrate" inserita
	 */
	public boolean DeleteLastEntrate() {
		boolean ok = false;
		final Connection cn = DBUtil.getConnection();
		final String sql = "SELECT * FROM " + Entrate.NOME_TABELLA + " WHERE " + Entrate.IDUTENTE + " = " + Controllore.getUtenteLogin().getidUtente() + " ORDER BY " + Entrate.DATAINS + " DESC";

		try {
			final Statement st = cn.createStatement();
			final ResultSet rs = st.executeQuery(sql);
			if (rs.next()) {
				final String sql2 = "DELETE FROM " + Entrate.NOME_TABELLA + " WHERE " + Entrate.ID + "=?";
				final PreparedStatement ps = cn.prepareStatement(sql2);
				ps.setInt(1, rs.getInt(1));
				ps.executeUpdate();
				ok = true;

			}

		} catch (final Exception e) {
			e.printStackTrace();
			// Controllore.getLog().severe("Operazione non riuscita: " +
			// e.getMessage());
		}
		try {
			cn.close();
		} catch (final SQLException e) {
			e.printStackTrace();
		}
		return ok;
	}

	@Override
	public AbstractOggettoEntita getEntitaPadre() {
		return entrate;
	}

	@Override
	public String getdata() {
		return entrate.getdata();
	}

	@Override
	public void setdata(final String data) {
		entrate.setdata(data);
	}

	@Override
	public String getdescrizione() {
		return entrate.getdescrizione();
	}

	@Override
	public void setdescrizione(final String descrizione) {
		entrate.setdescrizione(descrizione);
	}

	@Override
	public String getFisseoVar() {
		return entrate.getFisseoVar();
	}

	@Override
	public void setFisseoVar(final String FisseoVar) {
		entrate.setFisseoVar(FisseoVar);
	}

	@Override
	public int getidEntrate() {
		return entrate.getidEntrate();
	}

	@Override
	public void setidEntrate(final int idEntrate) {
		entrate.setidEntrate(idEntrate);
	}

	@Override
	public double getinEuro() {
		return entrate.getinEuro();
	}

	@Override
	public void setinEuro(final double inEuro) {
		entrate.setinEuro(inEuro);
	}

	@Override
	public String getNomeEntita() {
		return entrate.getNomeEntita();
	}

	@Override
	public void setnome(final String nome) {
		entrate.setnome(nome);
	}

	@Override
	public Utenti getUtenti() {
		return entrate.getUtenti();
	}

	@Override
	public void setUtenti(final Utenti utenti) {
		entrate.setUtenti(utenti);
	}

	@Override
	public void setDataIns(final String date) {
		entrate.setDataIns(date);
	}

	@Override
	public String getDataIns() {
		return entrate.getDataIns();
	}

	@Override
	public void notifyObservers() {
		super.notifyObservers();
	}

	@Override
	public synchronized void setChanged() {
		super.setChanged();
	}

	@Override
	public AbstractOggettoEntita getEntita() {
		return getEntitaPadre();
	}

}
